Каждый вопрос заслуживает отдельного обсуждения, а на все стало лень ответ печатать, когда начал.
Печатать реально долго, легче было реализовать примеры в карте:
Кроме последнего пункта, его нужно персонально рассматривать, так как игра не подразумевает использование для юнита двух списков. Например, можно наполнить список построек у юнита всеми зданиями, часть из которых блокировать при открытии одного списка и разблокировать при открытии второго, но это подходит, когда один рабочий. Можно сделать второй список из книги заклинаний, куда добавлены способности на основе игрушечных строений, чтобы было видно карту пути и всё такое, но там для них используется один приказ, то есть всегда одинаковое здание будет при нажатии на любую способность, а ещё нет стоимости золота и дерева, что тоже придётся как-то ваять триггерно. Можно перевоплощать юнита при смене списка в другого, но там тоже сложности, не помню точно какие, вроде бы связаны с расой, так как все строят по-разному.
С точкой сбора всё просто. Способность у игрока не заблокировать, потому нужно забрать её у всех зданий, которые есть на карте, либо будут построены.
Группа из максимум 9 юнитов работает немножко коряво, ранее мы с PT153 находили какой-то вариант, чтобы работало быстро, но лень пользоваться поиском. Вроде каждую 0.01 секунду проверялось количество выбранных юнитов, лишние удалялись из выбора.
Чтобы не было очереди, пришёл в голову лишь вариант с апгрейдом здания. Но у меня реализован просто пример для одного конкретного здания, а для нескольких абстрактных зданий нужно делать текстовым триггером, который будет для каждого здания запускать локальный таймер на нужное время и добавлять анимационный текстаг work. По отмене апгрейда, либо истечению таймера анимационный тег удаляется и создаётся воин, к которому привязывается соответствующий звук. Но есть и другие варианты, типа создавать внутри здания другое, которое реально будет производить юнитов, когда заказал апгрейд, там иная реализация. И не упомянул про затрачиваемые ресурсы. Потребуется забирать/возвращать часть ресурсов при отмене апгрейда.
На примере триггеров и фиолетовых строк в редакторе объектов смотри, как сделано улучшение Бугая в Дренорского бугая.
Конечно, мог бы сделать MUI триггер на GUI для отсутствия очереди, но это было бы громоздко и в техническом смысле уродливо. производящие здания заносились бы в массив, для которого будет массив таймеров, которые будут заноситься в виде событий на истечение таймера в другой триггер, а точнее будет несколько массивов таймеров, по максимальному числу тренируемых юнитов в любом производящем здании.
Только нанимать тех же актёров озвучки. У случае с другими людьми или голосовыми движками в лучшем случае удастся сделать что-то похожее, но всё равно будет понятно, что это имитация. Конкретики в вопросе мало, но подобную задачу решал новым голосом с длительным и подробным описанием для актёра его персонажа, чтобы он выдал приемлемую интонацию.
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Эх, друг) ну я реализовал так. Есть в способностях замечательный закл перевоплащение иллидана. В нейтрально - враждебных. То есть ты создаешь двух героев у одного рэнжа 600 у другова 100 например, а этот спел меняет твоих героев местами(каждому там уже свои спец эффекты делаешь). Там есть еще у меха спел есть похожий, там без ограничения по времени, ну думаю идею ты понял.
На 126 патче на мемхаке вот можно покупать модификаторы типа атаки, алгоритм для оружия будет тот же самый
На 131 патче функции смены типа атаки есть, но не работают (пока что =))
Морф не костыль, если делаете кампанию и там атаку может менять глав герой, тогда надо будет сделать Х (7) копий героя с новым типом атаки, а если у вас 100 героев и надо всем менять тогда раздувать до 700, это ужасно
Wurst позволит динамически заполнить базу таких героев, но это сложно
izelorr, бонусный урон от астрала пишется в константах карты. Его можно изменить. По умолчанию множитель равен x1.66.
Мои тесты показали, что 100 урона по юниту в астрале без доп. бонусов наносит верные 166. По герою 124.5, что тоже верно - урон умножается на (1 - процент сопротивления магии), а затем на бонус астрала. 100 * (1 - 0.25) * 1.66 = 124.5.
В этом действии Отряд - Pick every unit in (Random 1 units from (Units in Game Area <gen> owned by Player_Hero[Random_Duel])) and do (Actions) где задаётся Random_Duel? Оно как было при инициализации задано, так и не меняется. То есть сначала выбираешь в общей области сражений юнита игрока и перемещаешь его в дуэльную область, а через 2 секунды опять пытаешься выбрать в общей области сражений юнита этого игрока, которого уже там нет, он в дуэльной. Это только то, что бросилось в глаза в самом триггере, в игре не проверял.
Потому что при стандартном получении опыта вмешиваются игровые константы и формулы по которым они работают, либо своя система это тогда смотри 3 вопрос от бота, либо настраивай игровые константы как тебе надо, это все описано в базовой статье по редактору, раздел формулы WE.
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Я припоминаю как сталкивался с таким. Скорее всего это не лечится. Можно попробовать создавать даммика на месте здания и заставлять его использовать заклинание. Или даже полностью самому написать спелл - он довольно прост.
Не берите вы эти ульты для основы своих скиллов, они сделаны через одно место лиж бы работали в капмании, а там дальше хоть потоп.
Сделайте заклинание из канала, а юнитов вокруг делайте неуязвимыми.
Кажись придумал. Берем способность "трансмутация" выставляем коэффициент золота и дерева нуль, и ставим в целях героев, не героев, здания, неуязвимые и уязвимые. Но остается открытым вопрос, как запретить целить нейтральные здания, потому что сейчас их целить можно.
И это решилось. Просто убираем галочку "нейтральные" в целях. Таким образом, полный список целей выглядит так: воздушные, враги, герои, здания, наземные, не герои, неуязвимые, уязвимые.
То что сказали выше.
Только когда сидишь в гуях это не очевидно, и кажется что используются сами абилки типа "Верховный маг - Буран", а на самом деле это просто строка "blizzard".
Сконвертни триггер в текст и там где отдача приказа будет не айди абилки, а ее строковый приказ.
Так что если хранить приказ, используй строковую переменную. Или целочисленную, тк каждому строковому приказу соответствует целочисленный индекс.
Есть еще приказы для которых нет соответствующей строки, они отдаются только через число (например перемещение предмета по слотам), эти уже надо искать. Где-то таблица есть с числовыми приказами.
WakVellios, По всему проблема в том, что каждый юнит содержит slk таблицу присваивающему max min dmg для юнитов, а строки max min не предусмотрены в РО, с остальными полями всё работает.
Решается созданием кастомной slk таблицей новых юнитов.
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
Создай новый триггер
событие- Боевая единица входит в нужную область (A Units enters MYREGION)
условие - Боевая единица - Мой Герой (Unittype или Unit Comparison /+ Player comparison)
действие - Победа (Игра-Victory)
Предварительно создай область MYREGION
уйма времени уходит на то чтобы понять, что как работает
Де-факто нужно понимание принципов работы только в отношении тех или иных алгоритмов, внутреннее устройство игры может иметь значение в ну очень редких случаях.
мне кажется я чтото упустил....либо так..попробовать...
либо так
если integer A то он подберет из массива области увидит кто играет и создаст в эти области работников..либо присвоить по player number...не знаю
они и так рабочие
надо тестировать
Integer A всетаки буду использовать...по солиднее выглядит он..спасибо вопрос закрыт.
koloff, единственно верный вариант - перетащить весь импорт из карт в кампанию. Да, трудозатратно. Да, итоговый вес доставляет. Увы.
Представь длину списка файлов в импорте кампании под конец работы
Поэтому придется думать, что загружать, а что нет. По своему опыту знаю, что вычищать потом неиспользованные данные из импорта - сущий ад. Особенно если к каждой модели по 3-4 текстуры.
И да, музыка в mp3 формате тоже не дает грузится. Онли вав.
Gerhop, если у игрока лишь 1 герой то можно сразу дать этот скилл
при подборе предмета разрешать его а при выпадении запрещать
тогда вроде кд будет сохранятся
если мне память не изменяет
Как вариант - попытаться в одной текстуре клиффов попробовать разместить сразу два визуальных решения.
Текстуры клиффов находятся в mpq архиве по адресу ReplaceableTextures\Cliff\
Текстура клиффов
A. рандумные поверхности клиффов
B. тайлинг прямых граней, верхушка клиффа
C. тайлинг прямых граней, низ клиффа
D. угловые тайлы, выбирается 1 рандумный
E. угловые тайлы, низ клиффа
F. применяютя у мостов и подъёмников
Каждому клиффсету принадлежит два файла:
Угловатые клифы ReplaceableTextures\Cliff\Cliff0.blp
Прямые клифы ReplaceableTextures\Cliff\Cliff1.blp
Вроде всё правильно написал, если не прав поправьте.
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent
globals
constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
timer Zero//Used for 0. sec uses
integer ZTECurrent = 0
unit array ZTEUnits[ZTEArraySize]
integer array ZTEIntegers[ZTEArraySize]
real array ZTEReals[ZTEArraySize]
trigger array ZTETriggers[ZTEArraySize]
endglobals
function ZeroTimeEvent takes nothing returns nothing
loop
set ZTECurrent = ZTECurrent - 1
call TriggerExecute( ZTETriggers[ZTECurrent] )
exitwhen ZTECurrent < 1
endloop
endfunction
#define ZTEAddUnit(u) = {
set ZTEUnits[ZTECurrent] = u
}
#define ZTEAddInteger(i) = {
set ZTEIntegers[ZTECurrent] = i
}
#define ZTEAddReal(r) = {
set ZTEReals[ZTECurrent] = r
}
#define ConfirmZTE(trig) = {
set ZTETriggers[ZTECurrent] = trig
set ZTECurrent = ZTECurrent + 1
call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
}
endlibrary
Способность "Техника" имеет прикреплённые к ней спецэффекты шипов через одноимённое заклинание (тоже "Техника").
Почему шипы видны только на "больших героях"? - потому что у них есть особые точки крепления аттачей, маунт-справа/слева (на подобии нога-левая, рука-правая).
Как убрать? - логика подсказывает что нужно зачистить соответствующие поля в эффекте "Техника", что собственно и верно... и нет...
Дело в том что скилл "Техника" относится к тем, которые имеют ошибку с изменением графических параметров в РО. (меняешь, а оно всё равно по старому отображается - например тёмная стая, стадо ящерец).
Что же делать? - берёшь стандартную технику, смотришь её стандартный эффект. Удаляешь из стандартного эффекта всю графику (теперь техника не будет давать шипы). Копируешь стандартную технику - вот твой новый скилл который уже не будет давать шипов. Готово. Работаешь с новой копией.
Параметры стака ядов с одним и тем же баффом, это нужно чтобы складывались замедлени и\или урон от разных юнитов, или бафф тупо обновлялся.
С одним из параметров яды с разными баффами скатаются независимо, каждый вешает свой бафф. (годная основа для замедляющих способностей)
А игра вылетает из за зацикливания, темболее бафф при удалении и появлении наносит 0.00 ед урона, это так для справки.
Попробовал на карте дать приказ пехотинцам и стрелкам Отряд - ... Щелчок правой кнопкой мыши ... Они пошли с соблюдением боевого порядка, сначала пехотинцы, потом стрелки.
Если да, то заводишь глобальную переменную bool IsSpell = false, перед нанесением урона в коде даёшь ей true, после - обратно false. В триггере, который срабатывает на получение урона, первым действием ставишь локалку булёвую, которая ==IsSpell. Вуаля, ты отслеживаешь весь урон с абилок, а что не урон с абилок, то есть урон с руки.
Сам так всегда делал, никогда не понимал пляски с бубнами и прочими орбами. Оно, конечно, проще идеологически, но по факту намного геморройнее: добавлять орб, проверять орб, удалять орб, подменять реальный орб триггерно...
Кстати, можно по такой же схеме через логические переменные указывать тип урона, например, чистый, физический (почему бы и не давать с абилок физический урон?) или магический, от этого вообще что угодно можно пилить, хоть кучу видов брони, хоть цветовые индикаторы разного типа урона.
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Сергей45, дело в том, что когда ты ставишь юнита на карте, то при сохранении в скрипт карты добавляется кусок, который на старте игры именно в этих координатах создаст именно этого юнита, с указанным количеством здоровья, маны, уровнем, и предметами (если есть инвентарь).
Для тебя это просто "нажал, поставил, в игре он есть". На деле же - он создаётся отдельным куском скрипта (и это нормально).
Когда ты открываешь на юните (в редакторе) вкладку с выпадающими предметами, то там можно указать выпадающие предметы и их шанс при этом. Что происходит на самом деле? - в скрипт игры вшивается кусок, который регистрирует событие смерти этого юнита (а так же событие получения над ним контроля, если его захватят то предмет тоже выпадает). Умирая этот юнит пройдёт несколько простых проверок, и дальше под ним будут созданы предметы (из списка).
Список формируется в момент смерти юнита!
Когда юнит умирает, берётся глобальный список (общий), и в нём производится очистка. После этого в него добавляются предметы и числа (т.е. шанс). После этого особая хитрая функция выбрасывает случайное число и получает по нему один из предметов (записанных ранее в список).
Готово. Именно такова суть работы базового дропа предметов.
Дальше тебе надо используя событие смерти юнита, сделать проверку на его тип, и создать нужный предмет под ним (но это будет работать в 100% случаев). Если ты хочешь добавить к этому шанс, то можно просто дополнительно прикрутить выбрасывание случайного числа (например от 1 до 100), и если оно меньше некоего другого числа (например 40), то только тогда создаёшь предмет (это будет 40%-й шанс на дроп).
А вот если тебе надо сделать хитрее, например 100% что предмет выпадет, и из них 20% что это будет кольцо на +3, и остальные 80% что это будет кольцо на +2, тогда тебе придётся добавить ещё несколько проверок, и их число будет рости от количества этих вариантов дропа.
Если ты делаешь всё на 1.26 и у тебя есть JNGP, то ты можешь сразу использовать добавленные в GUI функции для работы со списком:
call RandomDistReset() очистка списка
call RandomDistAddItem(ID,X) добавление предмета ID с шансом X (число от 0 до 100)
set itemID = RandomDistChoose() получение случайного ID из списка, за счёт шанса
Первые два - на самом дне списка действий категории "Предмет" Третий - указывается вместо типа предмета, при его создании (тоже есть в списке)
Если у тебя нет возможность использовать JNGP (например из-за версии патча), тогда ты можешь просто на прямую обращаться к этим функциям (если, конечно, они не изменились). Но для этого тебе придётся чуть-чуть обрести понимания в том как работает Jass (и CS).
» WarCraft 3 / Разработка
» WarCraft 3 / Группа - юниты игрока вызывает утечку
» WarCraft 3 / Ошибка при начале игры
» WarCraft 3 / Как сменить тип атаки
» WarCraft 3 / Урон в астрал
» WarCraft 3 / Duel
» WarCraft 3 / Рандомный Герой
» WarCraft 3 / неуязвимость здания
» WarCraft 3 / Переменная - способность
» WarCraft 3 / Не показывается юнит
» WarCraft 3 / Скажите как убрать утечки?
» WarCraft 3 / Поле зрения юнита
» WarCraft 3 / Поясните за утечки
» WarCraft 3 / Создание/помощь в Триггере
» WarCraft 3 / Изгнание в астрал
» WarCraft 3 / Что делать, и как вылечить Редактор Карт?
» WarCraft 3 / Сброс кулдауна
» WarCraft 3 / Не заменяются текстуры склонов
» WarCraft 3 / Манипуляции с предметом
» WarCraft 3 / Дебаф промахов.
» WarCraft 3 / Способность Техника
» WarCraft 3 / Импортировал музыку. не работает!
» WarCraft 3 / Заставить ИИ выбрать юнита
» WarCraft 3 / Отлов урона
» WarCraft 3 / Респаун Крипов